#ifndef _MY_LOG_
#define _MY_LOG_

#include <vector>
#include <stdarg.h>
#include <cstring>
#include <ctime>
#include <fstream>

namespace QiHai
{

//#define MYFILE  // 定义此宏会在编译执行可执行文件的目录下生成一个MYLOG.log文件
#define MYDEBUG  // 定义此宏debug日志信息输出，否则不输出

	static const int DEBUG = 0;
	static const int NORMAL = 1;
	static const int WARNING = 2;
	static const int ERROR = 3;
	static const int FATAL = 4;

	static const char* levels[] = {
		"DEBUG",
		"NORMAL",   // 正常的
		"WARNING",  // 警告
		"ERROR",  // 错误但不致命
		"FATAL"     // 致命的错误
	};

	const char* logPath = "./MYLOG.log";

	// 日志打印消息，注意当前是否重复定义MYFILE宏，默认是定义的，会在当前目录下创建log文件将日志进行追加输入
	void LogMessage(int level, const char* format, ...)  // 可变参数
	{
#ifndef MYDEBUG
		if (level == DEBUG) return;  // 不打印debug信息
#endif // !MYDEBUG
		char endar[1024];
		va_list ap;  // 可变参数的列表
		va_start(ap, format);
		vsprintf_s(endar, format, ap);  // 类似于printf，此时输入到缓冲区endar中

		char headar[1024];
		char timeString[30];
		time_t timeStamp = time(nullptr);// 获取时间戳 默认时区
		struct tm tm;
		localtime_s(&tm, &timeStamp);  // 获取相关结构体
		asctime_s<30>(timeString, &tm);
		timeString[strlen(timeString) - 1] = '\0';
		snprintf(headar, sizeof headar, "[%s] [%s]", levels[level], timeString);
#ifdef MYFILE
		//C++文件流，打开一个写对象
		std::ofstream file(logPath, std::ios_base::app);  // 打开此文件，追加写 字符流
		file << headar << ":" << endar << std::endl;
		file.close();
#else
		// 不是文件输出就是标准输出
		printf_s("%s:%s\n", headar, endar);
#endif // MYFILE


	}

}

#endif